#include "algoritmos.h"

long saLinha(char *linha, char *padrao, int numLinha, int erro, int* ocorrencias) {
  int n = strlen(linha);
  int m = strlen(padrao);
  long Masc[MAX_CHAR];
  long i;
  long R = 0;
  long comp = 0;
  *ocorrencias = 0;
  
  // pre-processamento
  for (i=0; i<MAX_CHAR; i++) {
      Masc[i] = 0;
  }
  
  for (i=1; i<=m; i++) {
      Masc[padrao[i-1] + 127] |= 1 << (m-i);
  }
  
  // Busca    
  for (i=0; i<n; i++) {
    R = ((((unsigned long)R) >> 1) | (1 << (m-1))) & Masc[linha[i]+127];
    if ((R&1) != 0) {
       if (!ANALISE) imprimeResultado(linha, padrao, numLinha, i - m + 2);
       (*ocorrencias)++;
    }
    comp++;
  }

  return comp;
}


long saTexto(char **texto, char *padrao, int nLinhasTexto, int linhaInicial, int erro, float* tempo, int* ocorrencias) {
    long comparacoes = 0;
    int i=0;
    int ocorrenciasLinha = 0;
    *ocorrencias = 0;

    clock_t inicio, fim;
    inicio = clock();
    
    for (i=0; i<nLinhasTexto; i++) {
        char *linha = texto[i];
        comparacoes += saLinha(linha, padrao, linhaInicial, erro, &ocorrenciasLinha);
        linhaInicial++;
        *ocorrencias += ocorrenciasLinha;
    }
    
    fim = clock();
    *tempo = ( (float)fim -(float)inicio ) / ( (float)CLOCKS_PER_SEC );
    
    return comparacoes;
}
